home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / recio212.zip / rcbget.c < prev    next >
C/C++ Source or Header  |  1995-01-29  |  5KB  |  120 lines

  1. /*****************************************************************************
  2.    MODULE: rcbget.c
  3.   PURPOSE: recio column delimited integral number input functions
  4. COPYRIGHT: (C) 1994-1995, William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.12
  8.   RELEASE: January 29, 1995
  9. *****************************************************************************/
  10.  
  11. #include <ctype.h>
  12. #include <errno.h>
  13. #include <limits.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17.  
  18. #include "recio.h"
  19.  
  20. extern int _risready(REC *rp, int mode);
  21. extern char *_rfldstr(REC *rp, size_t len);
  22. extern char *_rerrs(REC *rp, int errnum);
  23. extern unsigned long str2ul(const char *nptr, char **endptr, int base);
  24.  
  25. #define rcol(rp) (rp->r_colno)
  26.  
  27. #define uint      unsigned int
  28. #define ulong     unsigned long
  29. #define UNSIGNED  0
  30. #define SIGNED    1
  31.  
  32. /****************************************************************************/
  33. static long                  /* return integral number                      */
  34.     _rcbgetl(                /* get integral number from col delim stream   */
  35.         REC *rp,             /* pointer to record stream                    */
  36.         size_t begcol,       /* field inclusive beginning column            */
  37.         size_t endcol,       /* field inclusive ending column               */
  38.         int base,            /* radix of number                             */
  39.         int sign,            /* signed number? (0=unsigned; !0=signed)      */
  40.         long min,            /* inclusive valid min value (0 if unsigned)   */
  41.         long max)            /* inclusive valid max value                   */
  42. /****************************************************************************/
  43.     long result=0L;          /* result to return */
  44.     long val;                /* conversion value */
  45.     char *fldptr;            /* pointer to field string */
  46.     char *endptr;            /* pointer to first invalid field char */
  47.     char *fldp;              /* another pointer to field string */
  48.  
  49.     if (_risready(rp, R_READ)) { 
  50.       if (endcol >= begcol && begcol >= rbegcolno(rp)) { 
  51.         rcol(rp) = begcol - rbegcolno(rp); 
  52.         fldptr = _rfldstr(rp, endcol-begcol+1); 
  53.         if (fldptr) { 
  54.           for (;;) { 
  55.             for (fldp=fldptr; *fldp; fldp++) {if (!isspace(*fldp)) break;} 
  56.             if (*fldp) { 
  57.               endptr = fldptr; 
  58.               errno = 0; 
  59.               if (sign) {
  60.                 val = strtol(fldptr, &endptr, base); 
  61.               } else {
  62.                 val = str2ul(fldptr, &endptr, base); 
  63.               }
  64.               while (isspace(*endptr)) endptr++; 
  65.               if (errno==ERANGE || !*endptr) { 
  66.                 if (!errno) { 
  67.                   if (sign) {
  68.                     if (val >= min && val <= max) { 
  69.                       result = val; 
  70.                       goto done; 
  71.                     }
  72.                   } else {
  73.                     /* note: unsigned min always assumed to be zero */
  74.                     if ((ulong) val <= (ulong) max) {
  75.                       result = val; 
  76.                       goto done;
  77.                     }
  78.                   }
  79.                 } /* out of range */ 
  80.                 fldptr = _rerrs(rp, R_ERANGE); 
  81.                 if (fldptr) { continue; } else { goto done; } 
  82.               } /* invalid data */ 
  83.               fldptr = _rerrs(rp, R_EINVDAT); 
  84.               if (fldptr) { continue; } else { goto done; } 
  85.             } /* missing data */ 
  86.             fldptr = _rerrs(rp, R_EMISDAT); 
  87.             if (fldptr) { continue; } else { goto done; } 
  88.           } 
  89.         }
  90.       } /* arguments reversed or tried to start before first column*/ 
  91.       rseterr(rp, R_EINVAL); 
  92.     } 
  93. done: 
  94.     return result; 
  95. }
  96.  
  97. /****************************************************************************/
  98. /* column delimited integral number input functions                         */
  99. /****************************************************************************/
  100. int rcbgeti(REC *rp, size_t begcol, size_t endcol, int base)
  101. {
  102.     return (int) _rcbgetl(rp, begcol, endcol, base, SIGNED, INT_MIN, INT_MAX);
  103. }
  104.  
  105. unsigned int rcbgetui(REC *rp, size_t begcol, size_t endcol, int base)
  106. {
  107.     return (uint) _rcbgetl(rp, begcol, endcol, base, UNSIGNED, 0, UINT_MAX);
  108. }
  109.  
  110. long rcbgetl(REC *rp, size_t begcol, size_t endcol, int base)
  111. {
  112.     return _rcbgetl(rp, begcol, endcol, base, SIGNED, LONG_MIN, LONG_MAX);
  113. }
  114.  
  115. unsigned long rcbgetul(REC *rp, size_t begcol, size_t endcol, int base)
  116. {
  117.     return (ulong) _rcbgetl(rp, begcol, endcol, base, UNSIGNED, 0L, ULONG_MAX);
  118. }
  119.